package com.wildeman.tokati.android;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import com.wildeman.tokati.constantes.Constantes;
import com.wildeman.tokati.core.Grupo;
import com.wildeman.tokati.core.Miembro;
import com.wildeman.tokati.db.DataHelper;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class NuevoMiembroActivity extends Activity 
{
	private DataHelper dh; //BBDD
	private final String TAG = "NuevoMiembro"; 	//Log
	private Grupo miGrupo;
	private Uri rutaFoto = null; 	//ruta URI Archivo de la foto tomada por la cámara o seleccionada en la galeria
	private boolean editarMiembro;
	Miembro miembro;
	
	ImageView imgMiembro;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.miembro);
        
        //capturamos los botones y controles de la actividad
        Button botGuardar = (Button) findViewById(R.id.buttonGuardarMiemb);
        Button botTomaFoto = (Button) findViewById(R.id.buttonTomaFoto);
        Button botSelImag = (Button) findViewById(R.id.buttonBuscaImagen);
        TextView txtTitulo = (TextView) findViewById(R.id.txtTitNuevoMiembro);
        imgMiembro = (ImageView) findViewById(R.id.imageMiembro);
        final EditText txtMiembro = (EditText) findViewById(R.id.editTextNombreMiembro);
        
        //detectamos si hay que agregar un nuevo miembro o editar uno existente
        editarMiembro = getIntent().getBooleanExtra(Constantes.EDITAR_MIEMBRO, false);
        
        if (editarMiembro) //Si se va a editar un grupo
        {
            //Capturamos el miembro a editar
        	miembro = (Miembro) getIntent().getSerializableExtra(Constantes.MIEMBRO);
        	
        	//Cambiamos el texto del titulo de la actividad
        	txtTitulo.setText(R.string.miembro_titulo_editar);
        	
        	//introducimos los valores del miembro
        	txtMiembro.setText(miembro.getNombres());
        	if (!miembro.getImagen().equals(""))
        	{
        		imgMiembro.setImageURI( Uri.parse(miembro.getImagen()) );
        	}
        	
        }
        else
        {
            //recuperamos el idGrupo desde la actividad
            miGrupo = (Grupo)getIntent().getSerializableExtra(Constantes.GRUPO);        	
        }
        
        
        /*---------------------------------------------------------------------------
         * captura del evento de pulsación del boton "Tomar foto"
         *--------------------------------------------------------------------------*/        
        botSelImag.setOnClickListener(new View.OnClickListener() 
        {
			
			@Override
			public void onClick(View v) 
			{
				seleccionaImagen();
			}
		});
        
        /*---------------------------------------------------------------------------
         * captura del evento de pulsación del boton "Tomar foto"
         *--------------------------------------------------------------------------*/        
        botTomaFoto.setOnClickListener(new View.OnClickListener() 
        {
			
			@Override
			public void onClick(View v) 
			{
				tomaFoto();
			}
		});
        
        
        
        /*---------------------------------------------------------------------------
         * captura del evento de pulsación del boton "Guardar"
         *--------------------------------------------------------------------------*/
        botGuardar.setOnClickListener(new View.OnClickListener() 
        {
			public void onClick(View v) 
			{
				Log.d(TAG, "Pulsación del botón Guardar...");
				
				Intent i = new Intent();
				
				if (editarMiembro)
				{
					if (rutaFoto != null)
					{
						miembro.setImagen(rutaFoto.toString());
					}
					
					//Se almacena en BBDD
			        Log.d(TAG, "Actualizando miembro en BBDD...");
			        dh.actualizaMiembro(miembro);
			        
			        i.putExtra(Constantes.MIEMBRO, miembro);
			        setResult(Constantes.MIEMBRO_EDITADO, i);
			        
			        Toast.makeText(NuevoMiembroActivity.this, R.string.miembro_toast_miembro_editado, Toast.LENGTH_SHORT).show();
				}
				else
				{
					int genero = 0;
			        //Se almacena en BBDD
			        Log.d(TAG, "Se almacena en BBDD...");
			        
			        int id = dh.insertarMiembro(txtMiembro.getText().toString(), rutaFoto==null?null:rutaFoto.toString(), genero,miGrupo.getIdGrupo());
			        miembro = new Miembro(id, txtMiembro.getText().toString(), rutaFoto==null?null:rutaFoto.toString(), genero);
			        
			        //devuelve el resultado a la actividad que ha llamado
			        i.putExtra(Constantes.MIEMBRO, miembro);
			        setResult(Constantes.MIEMBRO_AGREGADO, i);
			        
			        Toast.makeText(NuevoMiembroActivity.this, R.string.miembro_toast_nuevo_miembro_creado, Toast.LENGTH_SHORT).show();
				}
				
		        
		        
		        finish();
			}
		});
    }
    
    
    private void seleccionaImagen()
    {
    	Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    	i.setType("image/*");
    	i.setAction(Intent.ACTION_GET_CONTENT);
    	startActivityForResult(i, Constantes.SELECT_IMAGE); 
    }
    
    
    
    /**
     * Invoca a la aplicación por defecto para tomar fotos y devuelve el control a esta
     * actividad 
     */
    private void tomaFoto()
    {
    	creaArchivoFoto(this); //establece el URi del archivo
    	
    	final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    	
    	intent.putExtra(MediaStore.EXTRA_OUTPUT, rutaFoto); // set the image file name
    	intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    	
    	startActivityForResult(intent, Constantes.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
    
    /**
     * Devuelve un archvo con la ubicación donde se almacenará la foto tomada
     */
    private void creaArchivoFoto(Context context)
    {
    	String storageState = Environment.getExternalStorageState();
    	File _photoFile = null;
    	
        if(storageState.equals(Environment.MEDIA_MOUNTED)) 
        {
        	String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + NuevoMiembroActivity.this.getPackageName() + "/files/" + UUID.randomUUID() + ".jpg";
            _photoFile = new File(path);
            
            try 
            {
                if(_photoFile.exists() == false) 
                {
                    _photoFile.getParentFile().mkdirs();
                    _photoFile.createNewFile();
                }
            } 
            catch (IOException e) 
            {
                Log.e(TAG, "Could not create file.", e);
            }
            
            Log.d(TAG, path);
        }
        
        this.rutaFoto = Uri.fromFile(_photoFile);
    }
    
    
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
    	if (requestCode == Constantes.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 
    	{
            if (resultCode == RESULT_OK) 
            {
            	Toast.makeText(this, "Captura realizada",Toast.LENGTH_LONG).show();
            	imgMiembro.setImageBitmap( decodeFile(rutaFoto, true) );
            } 
            else if (resultCode == RESULT_CANCELED) 
            {
                // User cancelled the image capture
            	Toast.makeText(this, "Captura cancelada",Toast.LENGTH_LONG).show();
            } 
            else 
            {
                // Image capture failed
            	Toast.makeText(this, "Captura fallida", Toast.LENGTH_LONG).show();
            }
        }
    	else if (requestCode == Constantes.SELECT_IMAGE)
    	{
    		if(resultCode == RESULT_OK)
    		{  
    			Uri selectedImage = (Uri)data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                cursor.close();
                
                Log.d(TAG, "Imagen seleccionada: " + filePath);
                rutaFoto = Uri.fromFile( new File(filePath) );
                imgMiembro.setImageBitmap( decodeFile (rutaFoto, false) );

                //Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
                
            }
    	}
    	
    	
    	
    	
    	
    	
    }
    
    
    /**
     * Reduce el tamaño de la foto tomada para evitar OOM
     * @return Bitmap
     */
    private Bitmap decodeFile(Uri uri_imagen, boolean sobrescribir)
    {
        Bitmap b = null;
        try 
        {
            //Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;

            FileInputStream fis = new FileInputStream( uri_imagen.getPath() );
            BitmapFactory.decodeStream(fis, null, o);
            fis.close();

            int scale = 1;
            Log.d(TAG,"Dimensiones de la foto tomada. H:" + o.outHeight + " W:" + o.outWidth);
            if (o.outHeight > Constantes.IMAGE_MAX_SIZE || o.outWidth > Constantes.IMAGE_MAX_SIZE) 
            {
                scale = (int)Math.pow(2, (int) Math.round(Math.log(Constantes.IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
                Log.d(TAG,"Scale: " + scale);
            }

            //Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            fis = new FileInputStream(uri_imagen.getPath());
            b = BitmapFactory.decodeStream(fis, null, o2);
            fis.close();
            
            if (sobrescribir)
            {
	            OutputStream outstream = getContentResolver().openOutputStream(uri_imagen);
	            b.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
	            outstream.close();
            } 
            
        } 
        catch (Exception e) 
        {
        	Log.e(TAG, "Error en decodeFile: " + e.getMessage());
        }
        return b;
    }

    
    /** Called when the activity another activity comes in front od this activity */
	@Override
	protected void onPause() 
	{
		// TODO Auto-generated method stub
		super.onPause();
		dh.cerrar();
	}


	@Override
	protected void onResume() 
	{
		super.onResume();
		
        //Instancia de la BBDD
        dh = new DataHelper(this);
	}
	
	
	
    

}
